// 处理仓库地址格式
function parseGiteeRepo(repoUrl) {
  // 保存原始输入
  const originalUrl = repoUrl;
  
  // 提取用户名和仓库名
  let matches;
  if (repoUrl.includes('gitee.com')) {
    matches = repoUrl.match(/gitee\.com\/([^\/]+)\/([^\/\.]+)/);
    if (matches) {
      // 返回原始格式和解析后的格式
      return {
        original: originalUrl,
        owner: matches[1],
        repo: matches[2],
        parsed: `${matches[1]}/${matches[2]}`
      };
    }
  }
  
  throw new Error('无效的仓库地址格式，请使用完整的 Gitee URL');
}

// 处理文件路径
function normalizeFilePath(path) {
  // 移除开头的斜杠
  path = path.trim().replace(/^\/+/, '');
  
  // 如果没有扩展名，添加 .excalidraw
  if (!path.endsWith('.excalidraw')) {
    path = path + '.excalidraw';
  }
  
  return path;
}

// 获取 Excalidraw 数据
async function getExcalidrawData() {
  try {
    const tabs = await chrome.tabs.query({active: true, currentWindow: true});
    
    if (!tabs || !tabs[0]) {
      throw new Error('无法获取当前标签页');
    }
    
    if (!tabs[0].url.includes('excalidraw.com')) {
      throw new Error('请在 Excalidraw 网站上使用此插件');
    }

    // 尝试注入 content script
    try {
      await chrome.scripting.executeScript({
        target: { tabId: tabs[0].id },
        files: ['content.js']
      });
      console.log('Content script 已注入');
    } catch (e) {
      console.log('Content script 可能已经存在:', e);
    }

    return new Promise((resolve, reject) => {
      const timeout = setTimeout(() => {
        reject(new Error('获取数据超时，请刷新页面后重试'));
      }, 5000);

      chrome.tabs.sendMessage(
        tabs[0].id, 
        {action: "getExcalidrawData"}, 
        (response) => {
          clearTimeout(timeout);
          
          if (chrome.runtime.lastError) {
            console.error('发送消息错误:', chrome.runtime.lastError);
            reject(new Error('无法与页面通信，请刷新页面后重试'));
            return;
          }
          
          if (response) {
            console.log('获取到的数据:', response);
            resolve(response.assembledData);
          } else {
            reject(new Error('未收到页面响应，请刷新页面后重试'));
          }
      });
    });
  } catch (error) {
    console.error('获取数据出错:', error);
    throw error;
  }
}

// 保存配置时处理仓库地址
async function saveConfig() {
  try {
    const rawConfig = {
      giteeRepo: document.getElementById('giteeRepo').value,
      giteeToken: document.getElementById('giteeToken').value,
      giteePath: document.getElementById('giteePath').value
    };
    
    // 验证配置
    const errors = validateConfig(rawConfig);
    if (errors.length > 0) {
      showResult(errors.join('\n\n'), true);
      return;
    }
    
    // 处理配置
    const repoInfo = parseGiteeRepo(rawConfig.giteeRepo);
    const normalizedPath = normalizeFilePath(rawConfig.giteePath);
    
    const config = {
      giteeRepo: repoInfo.parsed,
      giteeRepoOriginal: repoInfo.original,
      giteeToken: rawConfig.giteeToken,
      giteePath: normalizedPath
    };
    
    await chrome.storage.sync.set({ config });
    showResult('配置已保存！', false);
  } catch (error) {
    showResult('保存配置失败: ' + error.message, true);
  }
}

// 从 Gitee 获取文件内容
async function getGiteeContent() {
  const config = await chrome.storage.sync.get('config');
  if (!config.config) {
    throw new Error('请先配置 Gitee 信息');
  }

  const { giteeRepo, giteeToken, giteePath } = config.config;
  const url = `https://gitee.com/api/v5/repos/${giteeRepo}/contents/${giteePath}`;
  
  const response = await fetch(url, {
    headers: {
      'Authorization': `token ${giteeToken}`
    }
  });

  if (!response.ok) {
    throw new Error('从 Gitee 获取数据失败');
  }

  const data = await response.json();
  return JSON.parse(atob(data.content));
}

// 添加一个辅助函数来生成 cURL 命令
function toCurl(url, options = {}) {
  let curl = `curl '${url}'`;
  
  if (options.method && options.method !== 'GET') {
    curl += ` -X ${options.method}`;
  }
  
  // 添加 headers
  if (options.headers) {
    Object.entries(options.headers).forEach(([key, value]) => {
      curl += ` \\\n  -H '${key}: ${value}'`;
    });
  }
  
  // 添加 body
  if (options.body) {
    if (options.body instanceof FormData) {
      for (let [key, value] of options.body.entries()) {
        curl += ` \\\n  -F '${key}=${value}'`;
      }
    } else {
      curl += ` \\\n  -d '${options.body}'`;
    }
  }
  
  return curl;
}

// 上传内容到 Gitee
async function uploadToGitee(content) {
  let baseUrl = '';
  let formData = null;
  let isNewFile = false;

  try {
    const config = await chrome.storage.sync.get('config');
    if (!config.config) {
      throw new Error('请先配置 Gitee 信息');
    }

    const { giteeToken, giteePath } = config.config;
    const repoInfo = parseGiteeRepo(config.config.giteeRepoOriginal);
    baseUrl = `https://gitee.com/api/v5/repos/${repoInfo.owner}/${repoInfo.repo}/contents/${giteePath}`;

    // 检查文件是否存在
    const checkResponse = await fetch(`${baseUrl}?access_token=${giteeToken}`);
    let sha = null;

    if (checkResponse.ok) {
      const fileInfo = await checkResponse.json();
      if (Array.isArray(fileInfo) && fileInfo.length === 0) {
        isNewFile = true;
      } else if (fileInfo.sha) {
        sha = fileInfo.sha;
      } else {
        throw new Error('无法确定文件状态');
      }
    } else {
      const errorText = await checkResponse.text();
      throw new Error(`检查文件状态失败: ${errorText}`);
    }

    // 准备上传数据
    formData = new FormData();
    formData.append('access_token', giteeToken);
    formData.append('content', btoa(unescape(encodeURIComponent(JSON.stringify(content)))));
    formData.append('message', 'Update Excalidraw data');
    formData.append('branch', 'master');

    if (!isNewFile && sha) {
      formData.append('sha', sha);
    }

    // 发送请求
    const response = await fetch(baseUrl, {
      method: isNewFile ? 'POST' : 'PUT',
      body: formData
    });

    if (!response.ok) {
      const errorText = await response.text();
      let errorData = tryParseJson(errorText) || { message: errorText };
      throw new Error(`Gitee 错误: ${errorData.message || errorText}`);
    }

    return await response.json();
  } catch (error) {
    console.error('上传失败:', error);
    throw error;
  }
}

// 辅助函数：安全地解析 JSON
function tryParseJson(text) {
  try {
    return JSON.parse(text);
  } catch (e) {
    return null;
  }
}

// 初始化页面
async function initializePage() {
  const config = await chrome.storage.sync.get('config');
  if (config.config) {
    // 优先使用保存的原始格式
    document.getElementById('giteeRepo').value = config.config.giteeRepoOriginal || config.config.giteeRepo || '';
    document.getElementById('giteeToken').value = config.config.giteeToken || '';
    document.getElementById('giteePath').value = config.config.giteePath || '';
  }
}

// 事件监听器
document.addEventListener('DOMContentLoaded', initializePage);

document.getElementById('saveConfig').addEventListener('click', saveConfig);

// 检查当前标签页是否是 Excalidraw
async function checkExcalidrawTab() {
  const tabs = await chrome.tabs.query({active: true, currentWindow: true});
  if (!tabs || !tabs[0] || !tabs[0].url.includes('excalidraw.com')) {
    throw new Error('请在 Excalidraw 页面使用此插件');
  }
  return tabs[0];
}

document.getElementById('syncToGitee').addEventListener('click', async () => {
  try {
    await checkExcalidrawTab(); // 添加页面检查
    showResult('正在获取数据...', false);
    const data = await getExcalidrawData();
    
    showResult('正在同步到 Gitee...', false);
    await uploadToGitee(data);
    
    showResult('成功同步到 Gitee！', false);
  } catch (error) {
    console.error('同步失败:', error);
    showResult(`同步失败: ${error.message}`, true);
  }
});

document.getElementById('pullFromGitee').addEventListener('click', async () => {
  try {
    const tab = await checkExcalidrawTab();
    const data = await getGiteeContent();
    
    // 先尝试注入 content script
    try {
      await chrome.scripting.executeScript({
        target: { tabId: tab.id },
        files: ['content.js']
      });
    } catch (err) {
      // 忽略重复注入的错误
      console.log('Content script 可能已存在');
    }

    // 等待更长时间确保页面和 content script 都加载完成
    await new Promise(resolve => setTimeout(resolve, 500));
    
    // 使用 async/await 重写消息发送逻辑
    try {
      showResult('正在设置数据...', false);
      const response = await chrome.tabs.sendMessage(tab.id, {
        action: "setExcalidrawData",
        data: data
      });
      
      if (response && response.success) {
        showResult('成功从 Gitee 拉取数据！', false);
      } else {
        throw new Error('设置数据失败');
      }
    } catch (err) {
      console.log('首次尝试失败，准备重试...');
      // 如果失败，等待页面完全加载后重试
      await new Promise(resolve => setTimeout(resolve, 1000));
      
      try {
        const response = await chrome.tabs.sendMessage(tab.id, {
          action: "setExcalidrawData",
          data: data
        });
        
        if (response && response.success) {
          showResult('成功从 Gitee 拉取数据！', false);
        } else {
          throw new Error('设置数据失败');
        }
      } catch (finalErr) {
        throw new Error('无法设置数据，请刷新页面后重试');
      }
    }
  } catch (error) {
    showResult(`错误：${error.message}`, true);
  }
});

// 在显示结果时添加状态样式
function showResult(message, isError = false) {
  const resultDiv = document.getElementById('result');
  resultDiv.textContent = message;
  resultDiv.className = isError ? 'error' : 'success';
  
  // 5秒后清除状态样式
  setTimeout(() => {
    resultDiv.className = '';
  }, 5000);
}

// 配置校验函数
function validateConfig(config) {
  const errors = [];
  
  // 检查仓库地址
  if (!config.giteeRepo) {
    errors.push('请输入仓库地址');
  } else if (!config.giteeRepo.includes('gitee.com') && !config.giteeRepo.startsWith('@')) {
    errors.push('仓库地址格式错误，请使用完整的 Gitee 仓库地址或以 @ 开头的格式\n例如：\nhttps://gitee.com/username/repo\n@username/repo');
  }
  
  // 检查访问令牌
  if (!config.giteeToken) {
    errors.push('请输入访问令牌');
  } else if (config.giteeToken.length < 10) {
    errors.push('访问令牌格式错误，请在 Gitee 设置页面生成正确的访问令牌');
  }
  
  // 检查文件路径
  if (!config.giteePath) {
    errors.push('请输入文件路径');
  } else if (!config.giteePath.endsWith('.excalidraw')) {
    errors.push('文件路径必须以 .excalidraw 结尾');
  } else if (config.giteePath.startsWith('/')) {
    errors.push('文件路径不能以斜杠(/)开头');
  }
  
  return errors;
} 